package ar.fiuba.tp7552.buildadmin.service.impl;

import java.util.Collection;
import java.util.List;

import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional;

import ar.fiuba.tp7552.buildadmin.dao.GenericDao;
import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.auth.BuildPermission;
import ar.fiuba.tp7552.buildadmin.model.auth.Role;
import ar.fiuba.tp7552.buildadmin.model.auth.User;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.service.EdificioService;
import ar.fiuba.tp7552.buildadmin.service.PermissionService;
import ar.fiuba.tp7552.buildadmin.service.PermissionType;

@Transactional
public class EdificioServiceImpl implements EdificioService {

	private GenericDao<Edificio, Long> edificioDao;
	private PermissionService permissionService;
	
	public EdificioServiceImpl(GenericDao<Edificio, Long> edificioDao, PermissionService permissionService) {
		super();
		this.edificioDao = edificioDao;
		this.permissionService = permissionService;
	}

	@Override
	public void createEdificio(Edificio edificio, User creatorUser) throws BusinessException {
		edificioDao.save(edificio);
		// cuando creo el edificio, al usuario creador le doy permiso de administracion.
		// al rol ROLE_ADMIN le doy permiso para todo.
		permissionService.addPermission(edificio, new Role(Role.ROLE_ADMIN), BuildPermission.ADMIN);
		permissionService.addPermission(edificio, new Role(Role.ROLE_ADMIN), BuildPermission.GASTO);
		permissionService.addPermission(edificio, new Role(Role.ROLE_ADMIN), BuildPermission.COBRO);
		
		permissionService.addPermission(edificio, creatorUser, BuildPermission.ADMIN);
	}
	
	@Override
	public Collection<Edificio> getAll() {
		return edificioDao.getAll();
	}

	@Override
	public void update(Edificio edificio) {
		edificioDao.update(edificio);
	}

	@Override
	public Edificio get(Long id) {
		return edificioDao.get(id);
	}
	
	@Override
	public void delete(Edificio edificio) {
		edificioDao.remove(edificio.getId());
		// tengo que borrar todos los permisos asociados al 
		// edificio que estoy borrando
		permissionService.deletePermissions(edificio);
	}

	@Override
	public Collection<Edificio> getAll(PermissionType type) {
		SecurityContext ctx = SecurityContextHolder.getContext();
		Object principal = ctx.getAuthentication().getPrincipal();
		User currentUser = (User) principal;
		List<Long> ids = permissionService.getObjectIdsByPermissions(currentUser, type);
		return edificioDao.getAll(ids);
	}
}
